import json


class WxEntity:
    def __init__(self, data):
        # 微信头像地址
        self.avatar_url = data.get('avatar_url')
        # 微信昵称
        self.nick_name = data.get('nick_name')
        # 备注
        self.remark = data.get('remark')
        # 微信账号
        self.wx_account = data.get('wx_account')
        # 微信ID
        self.wx_id = data.get('wx_id')

    def __str__(self):
        return json.dumps(self, default=lambda o: o.__dict__, ensure_ascii=False)

    def __repr__(self):
        return self.__str__()


class SelfInfo(WxEntity):
    def __init__(self, data):
        # 国籍
        super().__init__(data)
        self.nation = data.get('nation')
        # 省份
        self.province = data.get('province')
        # 城市
        self.city = data.get('city')
        # 手机号
        self.mobile = data.get('mobile')
        # 性别 0:未设置 1:男 2:女
        self.gender = data.get('gender')
        # 登录设备
        self.device = data.get('device')
        # 缓存目录
        self.cache_dir = data.get('cache_dir')


class WxContext:
    def __init__(self, self_info: SelfInfo, friend_list: list[WxEntity], chat_room_list: list[WxEntity]):
        self.self_info: SelfInfo = self_info
        self.friend_list: list[WxEntity] = friend_list
        self.chat_room_list: list[WxEntity] = chat_room_list

    def __str__(self):
        return json.dumps(self, default=lambda o: o.__dict__, ensure_ascii=False)

    def __repr__(self):
        return self.__str__()


class WxMessage:

    def __init__(self, data):
        # 推送类型，固定为100
        self.type = data.get('type')
        """
        消息类型
        1	文本消息
        3	图片消息
        34	语音消息
        37	好友请求
        40	可能是好友消息
        42	个人名片
        43	视频消息
        47	自定义表情包
        48	位置消息
        49	共享实时位置、等xml消息
        50	未知消息
        51	微信初始化消息
        52	未知消息
        53	未知消息
        62	小视频消息
        9999	未知消息
        10002	提现消息
        10000	系统消息
        """
        self.msg_type = data.get('msg_type')
        # 消息位置ID
        self.local_id = data.get('local_id')
        # 消息ID【自己发送的消息时为0】
        self.msg_id = data.get('msg_id')
        # 微信ID
        self.wx_id = data.get('wx_id')
        # 群消息艾特人列表，艾特所有人就是【notify @ all】
        self.at_list: list[str] = data.get('at_list', [])
        # 消息内容
        self.content = data.get('content')
        # 如果是群消息，该参数为发送者的微信ID，否则为空
        self.sender = data.get('sender')
        # 消息文件路径
        self.file_path = data.get('file_path')
        # 发送时间
        self.time_stamp = data.get('time_stamp')
        # 是否是自己发送的消息 0:别人发来的 1:自己发的
        self.is_self_msg = data.get('is_self_msg')
        # 是否是PC端发送的消息(仅用于判断自己发送的消息，别人发送的都是0) 0:否 1:是
        self.is_pc_msg = data.get('is_pc_msg')
        # 自己的微信ID
        self.self_wx_id = data.get('self_wx_id')
        # DLL的端口号
        self.port = data.get('port')

    def __str__(self):
        return json.dumps(self, default=lambda o: o.__dict__, ensure_ascii=False)

    def __repr__(self):
        return self.__str__()
